/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2025-06-12 17:57:19
 * @LastEditTime : 2025-06-12 17:58:05
 * @FilePath     : \GD32F407_BL\mobl\src\xxtea.c
 * @Description  : xxtea对称加密算法
 * @Version      : V1.0
 * @History      : 
 * @Note         : 
 */
/***************************************Includes***********************************/
#include "xxtea.h"


/************************************Private Macros********************************/

// 加解密时使用的常量值
// 由于固件程序是明文的，所以攻击者可以读取tea_DELTA来得知使用的加密算法
// stm32安全等级1是可以破解的，安全等级2破解难度大，需磨开MCU的FLASH区域，对设置安全等级的寄存器
// 区域进行照射有几率翻转该寄存器的某一位，此时即可降级的等级1，片内程序也可被读取出来。
#define tea_DELTA 0x9e3779b9
#define xxtea_MX ((((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z)))

/**********************************Private Statement*******************************/


/***********************************Public Variables*******************************/



/**********************************Private Variables*******************************/



/**********************************Public Functions********************************/

/**
 * @brief XXTEA加解密
 * @param  origin           为要加密的数据是两个32位无符号整数（若加密字符串先转换为16进制整数）
 * @param  n                的绝对值表示v的长度(即有几个32位整数)，取正表示加密，取负表示解密
 * @param  key              为加密解密密钥，为4个32位无符号整数，即密钥长度为128位
 * @note null
 */
void xxtea(uint32_t *origin, int n, const uint32_t key[4]) {
    uint32_t y, z, sum;
    unsigned p, rounds, e;
    if (n > 1) /* Coding Part */
    {
        rounds = 6 + 52 / n;
        sum = 0;
        z = origin[n - 1];
        do {
            sum += tea_DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++) {
                y = origin[p + 1];
                z = origin[p] += xxtea_MX;
            }
            y = origin[0];
            z = origin[n - 1] += xxtea_MX;
        } while (--rounds);
    } else if (n < -1) /* Decoding Part */
    {
        n = -n;
        rounds = 6 + 52 / n;
        sum = rounds * tea_DELTA;
        y = origin[0];
        do {
            e = (sum >> 2) & 3;
            for (p = n - 1; p > 0; p--) {
                z = origin[p - 1];
                y = origin[p] -= xxtea_MX;
            }
            z = origin[n - 1];
            y = origin[0] -= xxtea_MX;
            sum -= tea_DELTA;
        } while (--rounds);
    }
}

/**********************************Private Functions*******************************/


/* [] END OF FILE */
